/*—————————————————————————————————————————————————————————— 路由封装主页 ——————————————————————————————————————————————————————————*/

// 数据引入区
import { RouterIntercept } from './intercept' // 路由拦截函数
import { routers } from './routes' // 路由数组信息
import { lazy } from 'react' // 引入按需加载方法
import { useAppSelector } from '@/utils/hooks'
import { setBreadcrumbNameMap } from '@/utils/userMessage'

// ts接口引入
// ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
import { IRoute, limitRouter, RouterElement } from './interface'

// 动态加载所有页面
import config from '@/common/config/config'

/**
 * @权限路由加载函数
 * @limitsRouter 必传，用户权限的路由信息
 *
 * 注意事项：
 *  1、若是没有传 limitsRouter 则直接是按照默认设置的路由信息进行拼接
 *  2、此函数返回一个最终的路由组合信息
 */
// ---------------------------------------------------------------------------------------------
const LimitRouter = (limitsRouter: IRoute[] = []) => {
  // redux中hooks使用区域
  const publicStore = useAppSelector((state) => state.publicStore) // 获取公共模块数据

  // 如果存在值，则直接按照此路由进行底层数据
  publicStore.Router.length && (limitsRouter = publicStore.Router)

  // 最终返回element替换方法进行返回
  return ElementRouter([...routers, ...limitsRouter])
}

// 路由element替换内容方法
// ================================================================================
const ElementRouter: RouterElement<IRoute> = (routerList) => {
  // 声明面包屑名称对象中间值
  const breadcrumb = {}

  // 声明返回的承接值
  const element: limitRouter[] = routerList.map((item: IRoute) => {
    // 同步当前路由的路径信息作为key，标题作为value；存入面包屑的中间值
    breadcrumb[item.path] = item.title

    // 渲染成员承接值
    const elementItem = {
      ...item,
      // 如果有子集存在，则直接进行父级的方法赋值，否则进行路由拦截组件传入当前item的参数
      element: item.children ? (
        parentElement(item.fileAddress)
      ) : (
        <RouterIntercept item={item} />
      ),
    }

    // 如果有子集存在，则将子集数组带入本函数进行递归
    item.children && (elementItem.children = ElementRouter(item.children))

    // 弹出过滤好了的成员
    return elementItem
  })

  // 改变的面包屑的展示字典
  setBreadcrumbNameMap(breadcrumb)

  return element
}

// 存在子级路由element构成函数
// ================================================================================
const parentElement = (element: string) => {
  // 动态写入加载的路由
  const Dom = lazy(config.pagesMould[`/src/pages${element}.tsx`] as never)
  return <Dom />
}

// 导出此函数
// ---------------------------------------------------------------------------------------------
export default LimitRouter
